package chapter_array_and_linkedlist;

import java.util.Arrays;
import java.util.concurrent.ThreadLocalRandom;

public class Array {

    static int[] initArray() {
        return new int[]{1, 3, 2, 5, 4};
    }

    /**
     * 随机访问数组元素
     *
     * @param nums 数组
     * @return 随机数组元素
     */
    static int randomAccess(int[] nums) {
        int randomIndex = ThreadLocalRandom.current().nextInt(0, nums.length);
        return nums[randomIndex];
    }

    /**
     * 插入元素
     * 想在数组中间插入一个元素，则需要将该元素之后的所有元素都向后移动一位，之后再把元素赋值给该索引
     *
     * @param nums  数组
     * @param num   插入的数组元素
     * @param index 数组索引
     */
    /* 在数组的索引 index 处插入元素 num */
    static void insert(int[] nums, int num, int index) {
        // 把索引 index 以及之后的所有元素向后移动一位
        for (int i = nums.length - 1; i > index; i--) {
            nums[i] = nums[i - 1];
        }
        // 将 num 赋给 index 处的元素
        nums[index] = num;
    }

    /**
     * 删除索引 index 处的元素
     * 删除索引 i 处的元素，则需要把索引 i 之后的元素都向前移动一位。
     *
     * @param nums  数组
     * @param index 数组索引
     */
    static void remove(int[] nums, int index) {
        // 把索引 index 之后的所有元素向前移动一位
        for (int i = index; i < nums.length - 1; i++) {
            nums[i] = nums[i + 1];
        }
    }

    /**
     * 遍历数组
     *
     * @param nums 数组
     */
    static void traverse(int[] nums) {
        int count = 0;
        // 通过索引遍历数组
        for (int i = 0; i < nums.length; i++) {
            count += nums[i];
        }
        // 直接遍历数组元素
        for (int num : nums) {
            count += num;
        }
    }

    /**
     * 在数组中查找指定元素
     *
     * @param nums   数组
     * @param target 目标元素
     * @return 目标元素下标
     */
    static int find(int[] nums, int target) {
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == target) return i;
        }
        return -1;
    }

    /**
     * 扩展数组长度
     * 在大多数的编程语言中,数组的长度是不可变的
     * 拓容数组,需要建立一个更大的数组,然后把原数组元素依次复制到新数组当中
     *
     * @param nums    数组
     * @param enlarge 拓展后长度
     * @return 拓展后的数组
     */
    static int[] extend(int[] nums, int enlarge) {
        // 初始化一个扩展长度后的数组
        int[] res = new int[nums.length + enlarge];
        // 将原数组中的所有元素复制到新数组
        for (int i = 0; i < nums.length; i++) {
            res[i] = nums[i];
        }
        // 返回扩展后的新数组
        return res;
    }

    public static void main(String[] args) {
        int[] nums = initArray();

        // 随机访问数组元素
        int randomNum = randomAccess(nums);
        System.out.println(randomNum);

        insert(nums, 6, 2);
        System.out.println(Arrays.toString(nums));

        remove(nums, 6);
        System.out.println(Arrays.toString(nums));

        traverse(nums);
        System.out.println(Arrays.toString(nums));

        int target = find(nums, 3);
        System.out.println(target);

        int[] extendNums = extend(nums, 10);
        System.out.println(Arrays.toString(extendNums));
    }
}
